package com.ljh.aop.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author: Themberfue
 * @date: 2025/3/25 19:30
 * @description:
 */
@Slf4j
@Aspect
@Component
@Order(5) // ? 设置切面优先级，数字越小，优先级越大
public class AspectDemo2 {
    // ! 如没设置，则切面的优先级按照类名进行决定，不过实际开发中一般也不会按数字来命名
    // ! 使用 @Order 注解给切面设置优先级
    @Pointcut("execution(* com.ljh.aop.controller.*.*(..))")
    // ? 切点表达式语法：execution(<访问修饰符> <返回类型> <包名.类名.方法名(方法参数)> <异常>)
    // ? 访问修饰符 和 异常 为选填
    // ? * 可以匹配任意字符
    // ? 包名使⽤ * 表⽰任意包(⼀层包使⽤⼀个 *)
    // ? 类名使⽤ * 表⽰任意类
    // ? 返回值使⽤ * 表⽰任意返回值类型
    // ? ⽅法名使⽤ * 表⽰任意⽅法
    // ? 参数使⽤ * 表⽰⼀个任意类型的参数
    // ? .. 可以匹配多个连续的任意符号，可以通配任意层级的包,或任意类型,任意个数的参数
    public void pt() {}

    @Around("pt()")
    public Object aspectDemo(ProceedingJoinPoint pjp) {
        // TODO 执行目标方法之前执行
        log.info("demo2：目标方法执行前...");
        Object res;
        try {
            // TODO 执行目标方法
            res = pjp.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        // TODO 执行目标方法之后执行
        log.info("demo2：目标方法执行后...");
        return res;
    }
}
